package shujia.day18;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

//通过反射获取的Class对象获取类中的成员变量并使用
public class ClassDemo3 {
    public static void main(String[] args) throws Exception {
        Class<?> studentClass = Class.forName("shujia.day18.Student");

        //public Field getField(String name) 只能获取公共的public修饰的成员变量
        // 根据成员变量的名字获取对应的成员变量的对象
//        Field id = studentClass.getField("id");
//        System.out.println("id: " + id);

        //public Field getDeclaredField(String name) 获取任意修饰符修饰的成员变量
        Field id = studentClass.getDeclaredField("id");
        System.out.println("id: "+id);
        Field name = studentClass.getDeclaredField("name");
        System.out.println("name: "+name);
        Field age = studentClass.getDeclaredField("age");
        System.out.println("age: "+age);
        Field address = studentClass.getDeclaredField("address");
        System.out.println("address: "+address);

        //如何使用成员变量
        //之前的思想：给某一个对象中的某一个成员变量进行赋值
        //反射的思想：哪一个对象的成员变量要赋什么值
        //在使用成员变量之前，先知道给哪一个对象的该成员变量赋值
        Constructor<?> c1 = studentClass.getDeclaredConstructor();
        c1.setAccessible(true);
        Student s = (Student) c1.newInstance();
        System.out.println("s: "+s);
        //给学生对象s中的address成员变量进行赋值
        address.set(s, "安徽合肥");
        System.out.println("s: "+s);
        id.setAccessible(true);
        id.set(s, 1001);
        System.out.println("s: "+s);
        name.setAccessible(true);
        name.set(s,"张三");
        System.out.println("s: "+s);
        age.setAccessible(true);
        age.set(s, 18);
        System.out.println("s: "+s);
        System.out.println("--------------------------------------");

//        Field[] fields = studentClass.getFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }

        Field[] declaredFields = studentClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }


    }
}
